package com.iran.singleton;

/**
 * 加同步锁，懒汉模式。对getSingleton加同步锁，当一个线程获取了同步锁，另一个线程只能等待。这是有缺点地，加锁是一个耗时过程。
 * 每次实例化地时候，都得执行
 * 缺点：getSingleton.这样每次获取实例都比较耗时，读操作也加锁了。串行化了，可以采用double check的方式解决该问题,但依然有
 * 隐患是可能引起空指针异常，这里涉及到指令重排，举个例子：当这个私有方法内需要加载很多个引用甚至很多方法等比较重的情况时，当他还没有加载完
 * ，但是另一个线程已经抢到锁并开始执行这个单例对象的方法时，就会产生空指针，那么在singleton之前加上volatile,
 * 多线程情况下可用
 */
public class SingletonSynMethod {
    private static volatile SingletonSynMethod singleton = null;

    private SingletonSynMethod() {

    }

    /*public static synchronized SingletonSynMethod getSingleton(){
        if (singleton == null){
            singleton = new SingletonSynMethod();
        }
        return singleton;
    }*/
    public static SingletonSynMethod getSingleton(){
        if (singleton == null){//first check
            synchronized (SingletonSynMethod.class){
                if (singleton == null){//second check
                    singleton = new SingletonSynMethod();
                }
            }
        }
        return singleton;
    }
}
